﻿using System;
using System.Data.SqlTypes;
//4.8.4 重载true和false
//虽然true和false运算符会在极少用的类型（即布尔型）上重载，但是它们不能转换为bool。

namespace _124_运算符重载_重载true和false
{
    //下面代码重新实现了SqlBoolean中可以验证true和false运算符的一部分代码：
    public struct SqlBoolean
    {
        private byte m_value;
        private SqlBoolean(byte value) { m_value = value; }
        public static readonly SqlBoolean Null = new SqlBoolean(0);
        public static readonly SqlBoolean False = new SqlBoolean(1);
        public static readonly SqlBoolean True = new SqlBoolean(2);

        public static bool operator true(SqlBoolean x)
        {
            return x.m_value == True.m_value;
        }
        public static bool operator false(SqlBoolean x)
        {
            return x.m_value == False.m_value;
        }
        public static SqlBoolean operator !(SqlBoolean x)
        {
            if (x.m_value == Null.m_value) return Null;
            if (x.m_value == False.m_value) return True;
            return False;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //例如，一个类型通过重载true和false实现了三个逻辑状态，这样的类型可以无缝地与条件语句和运算符一起使用，即if、do、while、for、&&、||和?:。结构体System.Data.SqlTypes.SqlBoolean支持这个转换功能。
            SqlBoolean a = SqlBoolean.Null;
            if (a)
                Console.WriteLine("True");
            else if (!a)
                Console.WriteLine("False");
            else
                Console.WriteLine("Null");
            //输出Null


            Console.ReadKey();
        }
    }
}
